%pylab inline
import numpy as np # convert list to array
import matplotlib.pyplot as plt
Multirétegek optikai reflexiójának, transzmiszójának számolása a rétegekre merőlegesen haladó fényre.
Két elemi transzfermátrixból tetszÅ‘leges multiréteg transzfermátrixa felépÃthetÅ‘. A két elemi transzfermátrix:
1) A két közeg határának a bal és jobb oldalán $n_1$ és $n_2$ a törésmutató:
\begin{equation} {\bf M}(n_2,n_1) = \frac{1}{2}\, \left( \begin{array}{cc} \frac{n_1}{n_2}+1 & \frac{n_1}{n_2}-1 \\ \frac{n_1}{n_2}-1 & \frac{n_1}{n_2}+1 \end{array} \right). \nonumber \end{equation}
2) Egy $L$ vastagságú közegben a szabad terjedés transzfermátrixa:
\begin{equation} {\bf F}(k L) = \left( \begin{array}{cc} e^{i k L} & 0 \\[1ex] 0 & e^{-i k L} \end{array} \right),\nonumber \end{equation} ahol $k$ a hullámszám a közegben és $L$ a réteg vastagsága.
Feltevés: a fénysugár balról jobbra halad (vagy fentről lefelé az ábrától függően), ezért az $M$ mátrixok szorzása jobbról balra történik.
MerÅ‘leges beesésnél a TM ($\mathbf{E}$ a beesési sÃkban, azaz a papÃr sÃkjában van) és a TE módusra ugyanazt az eredményt kapjuk.
Különböző anyagok törésmutatója itt található: Filmetrics
def Mb(n2,n1):
res=1/2*(matrix([[1+n1/n2,n1/n2-1],
[n1/n2-1,1+n1/n2]]))
return(res)
def Mfree(kL):
#res=matrix([[exp(1j*kL),0+0*1j],[0+0*1j,exp(-1j*kL)]])
res=matrix([[exp(1j*kL),0],[0,exp(-1j*kL)]])
return(res)
def ref_trans(M,nR,nL):
detM = det(M)
r=-M[1,0]/M[1,1]
t= detM/M[1,1]
RR=(abs(r))**2
TT=nR/nL*(abs(t))**2
check = RR+TT
return(r,t,RR,TT,check,detM)
def egy_reteg(x,nvec,kappavec):
nL, n1, nR = nvec
kappaL, kappa1,kappaR = kappavec
# Transfer matrix for 1 layers:
#Mtot=Mb(nR, n1)*Mfree(a1/x)*Mb(n1, nL)
Mtot = Mb(nR, n1*(1+1j*kappa1))*Mfree(pi/2*x*(1+1j*kappa1))*Mb(n1*(1+1j*kappa1), nL);
# Extracting the reflection/transmission amplitudes, etc.
r,t,RR,TT,check,detM =ref_trans(Mtot,nR,nL)
return(r,t,RR,TT,check,detM)
def ket_reteg(x,nvec,kLvec):
nL, n1, n2, nR = nvec
a1, a2 = kLvec
# Transfer matrix for 2 layers:
Mtot=Mb(nR, n2)*Mfree(a2/x)*Mb(n2, n1)*Mfree(a1/x)*Mb(n1, nL)
# Extracting the reflection/transmission amplitudes, etc.
r,t,RR,TT,check,detM =ref_trans(Mtot,nR,nL)
return(r,t,RR,TT,check,detM)
def harom_reteg(x,nvec,kLvec):
nL, n1, n2, n3, nR = nvec
a1, a2, a3 = kLvec
# Transfer matrix for 3 layers:
Mtot=Mb(nR, n3)*Mfree(a3/x)*Mb(n3, n2)*Mfree(a2/x)*Mb(n2, n1)*Mfree(a1/x)*Mb(n1, nL)
# Extracting the reflection/transmission amplitudes, etc.
r,t,RR,TT,check,detM =ref_trans(Mtot,nR,nL)
return(r,t,RR,TT,check,detM)
Here $\lambda_0$ is the incident wavelength of light coming from the vacuum.
We set the reference wave length $\lambda_r$ such that $R(\lambda_0 = \lambda_r) =0$.
Here for example a quarter-wave film means that $ n L = \frac{\lambda_0}{4}$, where $n$ and $L$ are the refraction index and the thickness of the film, while $\lambda_0$ is the wave length in the vacuum.
Then $k L = k_0 n L = k_0 \frac{\lambda_0}{4} = \frac{2\pi}{\lambda_0}\, \frac{\lambda_0}{4} = \frac{\pi}{2}$, where $k =n k_0$ and $k_0$ are the wave numbers in the film and the vacuum.
nvec=[1, 1.4, 2., 1.62]
kLvec=[pi/2, pi]
Npoints = 300
xmin = 0.25;
xmax = 1.7 # 1.23;
xvec=linspace(xmin,xmax, Npoints)
res=array([array(ket_reteg(x,nvec,kLvec)) for x in xvec])
Rvec=[real(100*res[i][2]) for i in range(len(res))]
xvec_ticks=[0.38, 0.498, 0.6, 0.8, 1, 1.2]
res_ticks=array([array(ket_reteg(x,nvec,kLvec)) for x in xvec_ticks])
Rvec_ticks=[100*real(res_ticks[i][2]) for i in range(len(xvec_ticks))]
xs=[]
for m in xvec_ticks:
if (m ==1):
xs.append(r'$\,\lambda_0$')
else:
if(m == xvec_ticks[1]):
xs.append('')
else:
xs.append(str(m) +r'$\,\lambda_0$')
labels = xs
xticks(xvec_ticks,labels,fontsize=16)
#[print('lambda = ', xvec_ticks[i], ', R (%) = ', around(Rvec_ticks[i],2)) for i in range(len(xvec_ticks))]
figsize(12,6)
plot(xvec,Rvec)
title('Reflectivity of the two layer AR coating \n as a function of the incident wavelength', fontsize=16)
xlabel(r'$\lambda$', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
axis('tight')
grid();
K. K. Sharma: Optics Principle and Application page 312, Fig. 6.38
Itt a fénysugár fentről lefelé halad.
nvec=[1, 1.38, 2.3, 1.76, 1.62]
kLvec=[pi/2, pi, 3*pi/2]
Npoints = 100
xmin = 0.8;
xmax = 625/500 # 1.23;
xvec=linspace(xmin,xmax, Npoints)
res=array([array(harom_reteg(x,nvec,kLvec)) for x in xvec])
Rvec=[real(100*res[i][2]) for i in range(len(res))]
lamref=500 # \lambda reference, $\lamabda_r = 500 $ nm
#array(M).flatten() # convert Matrix M to array
xvecl=array(matrix(xvec)*lamref).flatten() # xvecl ---> lambda_0 ugy, hogy lambda_0 = lambda_r -nel
# zerus legyen R.
figsize(10,6)
plot(xvecl,Rvec)
title('Reflectivity of the three layer AR coating \n as a function of the incident wavelength ' + r'$\lambda_0 ,$' +
'\n reference wave length '+ r'$\lambda_r = $' + str(lamref)+' nm', fontsize=16)
xlabel(r'$\lambda_0$'+' (nm)', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
axis('tight')
grid();
Az alábbi eredmény megtalálható Max Born and Emil Wolf: Principles of optics (7th Eds., Cambridge Univ. Press, 1999) könyvében a 757. oldalon, Fig. 14.5. vagy a 6th Eds., 1980 kiadásban a 655. oldalon. Az eredeti cikk: K. Hammer, Z. Tech. Phys. 24, 169 (1943).
Megj.:A könyvben használt képletek sokkal bonyolultabbak, mint a fenti módszer.
Itt a fénysugár fentről lefelé halad.
A középső réteg fémből van, ezért a törésmutatója komplex szám, azaz $\hat{n} = n_1(1+i\kappa_1)$.
nvec=[1, 3.5 ,1.5]
kappavec = [0, 0.1, 0]
#kLvec = [pi/2]
Npoints = 100
xmin = 0.01
xmax = 5.7
xvec=linspace(xmin,xmax, Npoints)
res=array([array(egy_reteg(x,nvec,kappavec)) for x in xvec])
Rvec=[real(100*res[i][2]) for i in range(len(res))]
Tvec=[real(100*res[i][3]) for i in range(len(res))]
Avec=[100-real(100*res[i][2])-real(100*res[i][3]) for i in range(len(res))]
figsize(10,6)
plot(xvec,Rvec,'b-',label='R')
plot(xvec,Tvec, 'r-',label='T')
plot(xvec,Avec, 'k-',label='A')
title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$',\
fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\, units\, of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
axis('tight')
legend(loc='upper right',fontsize = 15)
text(0.8,85,'$n_L, n_1, n_R =$'+str(nvec),fontsize=15)
text(0.8,75,'$\kappa_L, \kappa_1, \kappa_R =$'+str(kappavec),fontsize=15)
grid();
nvec=[1, 3.5 ,1.5]
Npoints = 100
xmin = 0.01
xmax = 5.7
xvec=linspace(xmin,xmax, Npoints)
kappavec1 = [0,0.1,0]
res1=array([array(egy_reteg(x,nvec,kappavec1)) for x in xvec])
Rvec1=[real(100*res1[i][2]) for i in range(len(res1))]
kappavec2 = [0,0.2,0]
res2=array([array(egy_reteg(x,nvec,kappavec2)) for x in xvec])
Rvec2=[real(100*res2[i][2]) for i in range(len(res2))]
kappavec3 = [0,0.,0]
res3=array([array(egy_reteg(x,nvec,kappavec3)) for x in xvec])
Rvec3=[real(100*res3[i][2]) for i in range(len(res3))]
figsize(10,6)
plot(xvec,Rvec1,'b-',label=r'$\kappa_1 = $'+str(kappavec1[1]))
plot(xvec,Rvec2,'k--',label=r'$\kappa_1 = $'+str(kappavec2[1]))
plot(xvec,Rvec3,'r--',label=r'$\kappa_1 = $'+str(kappavec3[1]))
title('Reflectivity $R$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$',fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\, units\, of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')
legend(loc='upper right',fontsize = 15)
#text(0.8,85,'$n_L, n_1, n_R =$'+str(nvec),fontsize=15)
#text(0.8,75,'$\kappa_L, \kappa_1, \kappa_R =$'+str(kappavec),fontsize=15)
grid();
nvec=[1, 3.5 ,1.5]
#kLvec = [pi/2]
Npoints = 100
xmin = 0.01
xmax = 5.7
xvec=linspace(xmin,xmax, Npoints)
kappavec1 = [0,0.1,0]
res1=array([array(egy_reteg(x,nvec,kappavec1)) for x in xvec])
Tvec1=[real(100*res1[i][3]) for i in range(len(res1))]
kappavec2 = [0,0.2,0]
res2=array([array(egy_reteg(x,nvec,kappavec2)) for x in xvec])
Tvec2=[real(100*res2[i][3]) for i in range(len(res2))]
kappavec3 = [0,0.,0]
res3=array([array(egy_reteg(x,nvec,kappavec3)) for x in xvec])
Tvec3=[real(100*res3[i][3]) for i in range(len(res3))]
figsize(10,6)
plot(xvec,Tvec1,'b-',label=r'$\kappa_1 = $'+str(kappavec1[1]))
plot(xvec,Tvec2,'k--',label=r'$\kappa_1 = $'+str(kappavec2[1]))
plot(xvec,Tvec3,'r--',label=r'$\kappa_1 = $'+str(kappavec3[1]))
title('Transmission $T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\, units\, of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')
legend(loc='upper right',fontsize = 15)
#text(0.8,85,'$n_L, n_1, n_R =$'+str(nvec),fontsize=15)
#text(0.8,75,'$\kappa_L, \kappa_1, \kappa_R =$'+str(kappavec),fontsize=15)
grid();
figsize(10,6)
Avec1= array([100-Rvec1[i]-Tvec1[i] for i in range(len(xvec))])
plot(xvec,Avec1,'g-',lw=2,label=r'$A$')
plot(xvec,Rvec1,'b-',label=r'$R$')
plot(xvec,Tvec1,'r-',label=r'$T$')
title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\, units\, of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')
text(2,75,r'$\kappa_1 =$'+str(kappavec1[1]), fontsize=18)
legend(loc='upper right',fontsize = 15)
grid();
figsize(10,6)
Avec2= array([100-Rvec2[i]-Tvec2[i] for i in range(len(xvec))])
plot(xvec,Avec2,'g-',lw=2,label=r'$A$')
plot(xvec,Rvec2,'b-',label=r'$R$')
plot(xvec,Tvec2,'r-',label=r'$T$')
title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\, units\, of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')
text(2,75,r'$\kappa_1 =$'+str(kappavec2[1]), fontsize=18)
legend(loc='upper right',fontsize = 15)
grid();
figsize(10,6)
Avec3= array([100-Rvec3[i]-Tvec3[i] for i in range(len(xvec))])
plot(xvec,Avec3,'g-',lw=2,label=r'$A$')
plot(xvec,Rvec3,'b-',label=r'$R$')
plot(xvec,Tvec3,'r-',label=r'$T$')
title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\, units\, of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')
text(2,75,r'$\kappa_1 =$'+str(kappavec3[1]), fontsize=18)
legend(loc='upper right',fontsize = 15)
grid();